{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Global Optimization (Basin Hopping)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from optiland import optic, optimization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a starting lens:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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O1f09fXV3f/mm28KAOLVV181tv3oRz8SAMTWrVvb1UxqYPfu3WLBggXi/PPPrwlM7DtreuONN8Qf//jHim3nnHOOmDt3rvE4EokIu91e8Yf4s88+KwCIP/zhD21rK1W66aabxMKFCyu2nXzyyeKUU04xqUXUyLPPPis2b95csS0YDIrLLrtMCCHEM888IyRJEv39/cb+2267TTidThGPx9vaVqrvqaeeEuedd56YPXt2RWB64IEHRFdXl8hms8a2Sy65RBxyyCEmtJKqXXTRRWL16tVC1/W6+9l/rcEpeW00ODiIG264AXfeeScmTZpU95j169dDkiQsWLDA2LZkyRIAqBlipfa76qqrcOutt8LtdtfsY99Z01FHHYWTTjqpYtvg4CAOP/xw4/ELL7wATdOwaNEiY1ux7/785z+3p6FUY/369RV9AuT75aWXXoKu6ya1iuo57bTTcNhhhxmPU6kU0um08XO2fv169PT0oKuryzhmyZIlSKVS2LhxY9vbS5VisRiuu+463HvvvTX71q9fj6OPPho2m83YtmTJEmzfvh27du1qZzOpynPPPYdHH30U//7v/w5Jkuoew/5rDQamNvr5z38OTdOgKAouvvhiLF++HKeccgqeeuop45gtW7bA6/VCURRj28yZMwGA39gme+yxxxAOh3HBBRfU3c++6wyvvvoqXnzxRdx2223Gti1btgAAgsGgsc3v98Pr9bLvTLRly5aKPgHyP1PpdBp9fX3mNIqa8uCDD8Lv9+PKK68E0LgvAb4/WsEtt9yCCy+8EHPmzKnZx76zrh/84AdYsmQJnnzySXzsYx/D4sWLsXr1arz11lvGMey/1lCGP4SaUf7NWW3evHlQVRUvvvgiMpkMIpEIfvzjH0NRFNx4440455xz8Morr2DRokUYGhqC0+msON/lcgEANE0b069homqm78LhMK699lo888wzDY9l37VfM31XLhqN4hOf+ATuvvvuilGnoaEhAKjbf+w78/BnqjO9/vrr+NrXvoZf//rXxogS+9K6/vSnP+Hpp5/GG2+8UXc/+866XnzxRQghcNRRR+Fzn/sc4vE4PvKRj+CMM87A5s2b4XQ62X8twsDUIvPnz2+4b/PmzTjssMPQ29uLRYsW4V//9V+Nfbfffjvuvfde/OIXv8CiRYtgt9trqgZls1kAgMfjGZvGT3DN9N2aNWtw7rnnVky3A/K/SNauXYt77rmHfWeCZvquSNM0nHfeeVi9ejWuvfbaimPtdjsAIJ1OV0y3zGaz7DsT8Weq82zfvh2rV6/Gf/3Xf+HEE080trMvrSmdTuPTn/407r77buOP6KK//e1veO2119h3Ftbb24svfOELOPXUUwHk++Omm27CmWeeiT/+8Y8444wz2H8twsDUIqKJ8oz1vmm9Xi8CgYAxvaSnpwfRaBTJZNJ489q/fz+A/Cfm1HrD9d2+ffvw+9//HpMnT8ayZcsAAFu3bkU6ncYJJ5yAo48+GgD7zgzN/NwVXX755ZgzZw6+8Y1v1Ozr6ekBAOzduxehUAgAkMlkMDg4yL4zUU9PD/bu3Vuxbf/+/QiFQkY/kXUMDg7iIx/5CL7yla/gzDPPrNjX09NTs1aJ74/m+81vfoOhoSHcfffduPvuuwEAe/bswQ9/+EM88sgjuOqqqxr+HALAoYce2vY2U0m9vyuL0+3K/65k/x08rmFqo4ULF2L79u3IZDLGtqGhIUSjUeMXRvEP8ldffdU4ZuPGjVBVFSeffHJ7G0wAgO7ubuzYsQMbN27Ehg0bsGHDBpx55pk49thjsWnTJjz66KMA2HdWdt9992H37t148MEHjW2//e1vjekIS5cuBQC88sorxv7XX38duq7jtNNOa29jybBs2bKKPgHyP1PsE2u69NJLcd555+GSSy4xtv36178GkO/LvXv3VqyZ2LhxI7q7u3HMMce0va2Ud84552DHjh3G77YNGzZg+vTp+PSnP40tW7ZgzZo1WLZsGf7xj39U/GG+ceNGHHfccQgEAia2nhYuXGiswS0q/oyV/13J/msBc4v0TSybN28WTqezovb9zTffLEKhkNi1a5cQIn+timOOOUace+65Qtd1kc1mxamnniquvvpqs5pNdVx00UXipJNOqtjGvrOm7du3C7fbLe6//37x+OOPi8cff1z86Ec/En6/X4TDYeO4j3zkI2Lp0qUilUoJIYT4xCc+Ic4++2yTWk1ClK679Pjjjwsh8iXi3W63eOmll8xtGNV49NFHxZQpU8Rjjz1m/JytXbtWLFq0SAghRDQaFVOnThXXXHONECJ/bZgjjjhC3HvvveY1muqaMWOG+PKXv2w8fvfdd4Xb7Rb33XefEEKI3t5eMWnSJPHLX/7SpBZS0SOPPCIURREvv/yyECJ//cdVq1aJZcuWGWXG2X+twcDUZs8//7w48cQTxeLFi8WiRYvEWWedJf7xj39UHLNt2zbxoQ99SCxYsEAcf/zx4tprrxXpdNqkFlO19evXi66uLuF0OsW6desq9rHvrOdzn/ucAFD3X3lg6uvrExdccIE48sgjxdKlS8UnP/lJEYlEzGs4CSGE+NnPfibmz58vVqxYIU444QTxxBNPmN0kqmP+/Pl1f8aKgUkIITZu3CiWL18ujj32WLFkyRLx1a9+teG1Y8gc3/rWtwQAceihh4q//e1vxvZnn31WLF68WCxbtkwsWbJEfP/73zexlVTugQceEEcffbQ44YQTxNFHHy0++9nPVvxuE4L91wqSECNYBEBERERERDSBcA0TERERERFRAwxMREREREREDTAwERERERERNcDARERERERE1AADExERERERUQMMTERERERERA0wMBERERERETXAwERERERERNQAAxMREREREVEDDExERDQufOpTn0IwGMTKlStx1llntf31zzrrLKxcuRLBYBCf+tSn2v76REQ0NhSzG0BERFTu3Xffxdy5cxEIBLBw4ULIcv6zvb///e+IRCLYtGkTjjjiiLrnLl68GM8//3wbW1vy5JNPAgBWrlxpyusTEdHYYGAiIiLLkSQJ//d//4dFixYBAHbu3IkjjjgCn/zkJxuGJSIiorHAKXlERGQpTqcTl19+uRGWAODmm2+GJEn4+te/bmLLiIhoImJgIiIiS5k2bRp++MMfGo9feuklrFu3DjfffDOmT5/e9PMkEgmcffbZkCQJTz31FG699VYsXboUc+bMwe9+9zusX78el112GWbPno3zzz8f2WwWALBp0yYsWLAAiqLgzTffxOc//3nMmzcPxx9/PN577z089NBD+OhHP4pp06bhrrvuavnXT0RE1sLARERElnbddddh1qxZ+OIXvzii89xuN+677z4AwP33348vfelL2LBhA2bMmIELL7wQb7/9Nv7zP/8Tv/nNb/DYY4/hV7/6FQDgqKOOwjXXXINcLod169bhu9/9Lv76179i06ZNOOWUU7B48WI89thjuP322/HlL38Ze/bsafnXTERE1sHARERElvXTn/4Uf/nLX3DXXXfB5XKN+HxFyS/VveKKK+DxeCBJEk488UQAwOc//3kAwPz58xEKhfD222/XnLdmzRoAQFdXF4488kgsWbIES5cuBQCsWLECuVwOW7duHf0XSERElsfARERElpRMJnHzzTdj2bJl+PjHP35Qz+Xz+Yz7Xq+34nFxf3FKXrPnFe/XO4+IiMYPVskjIiJLuueee7Bjxw78/Oc/hyRJLXvees/VzPNXH9PKNhERkXVxhImIiCxn9+7d+OY3v4kLL7wQy5YtM7ZfccUVeOGFF0xsGRERTTQMTEREZDm33HILdF2vqEIXiUTwq1/9CrquN/086XQaAKBpmrEtkUhUPC5uy2QyIzovkUgAQMV5REQ0/jAwERGRpbz11lt4+OGH4XQ6cckll2DlypVYuXIl5s+fj/7+/hE910033QQA+OpXv4r9+/fj9ddfx09+8hPs2bMH//Zv/wYA+OY3v4n9+/fj4YcfxiuvvIKdO3fiO9/5DgDg6quvBpAvPrFx40Y8/fTT+N3vfgchBG644QYAwFe+8hWEw+FWfflERGQxkhBCmN0IIiKig/WpT30K7777Lp5//nlT27Fy5UrMmTMHP/7xj01tBxERtQZHmIiIiIiIiBpgYCIiIiIiImqAZcWJiGjceO2117By5Up4vV48+eSTbX3ts846C0NDQ3jttdcwZ86ctr42ERGNHa5hIiIiIiIiaoBT8oiIiIiIiBpgYCIiIiIiImqAgYmIiIiIiKgBBiYiIiIiIqIGGJiIiIiIiIgaYGAiIiIiIiJqgIGJiIiIiIioAQYmIiIiIiKiBv5/m6bxjMaI3sIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens = optic.Optic()\n",
    "\n",
    "# add surfaces\n",
    "lens.add_surface(index=0, thickness=60)\n",
    "lens.add_surface(index=1, thickness=7, radius=50, material=\"N-SF2\", is_stop=True)\n",
    "lens.add_surface(index=2, thickness=60, radius=-50)\n",
    "lens.add_surface(index=3)\n",
    "\n",
    "# set aperture\n",
    "lens.set_aperture(aperture_type=\"EPD\", value=15)\n",
    "\n",
    "# add field\n",
    "lens.set_field_type(field_type=\"object_height\")\n",
    "lens.add_field(y=0)\n",
    "\n",
    "# add wavelength\n",
    "lens.add_wavelength(value=0.55, is_primary=True)\n",
    "\n",
    "# draw lens\n",
    "lens.draw(num_rays=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define optimization problem:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "problem = optimization.OptimizationProblem()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Add operands (targets for optimization):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# RMS spot size target\n",
    "for field in lens.fields.get_field_coords():\n",
    "    input_data = {\n",
    "        \"optic\": lens,\n",
    "        \"Hx\": field[0],\n",
    "        \"Hy\": field[1],\n",
    "        \"surface_number\": -1,\n",
    "        \"num_rays\": 5,\n",
    "        \"wavelength\": 0.55,\n",
    "        \"distribution\": \"hexapolar\",\n",
    "    }\n",
    "    problem.add_operand(\n",
    "        operand_type=\"rms_spot_size\",\n",
    "        target=0,\n",
    "        weight=1,\n",
    "        input_data=input_data,\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define variables - we let the Zernike coefficients vary."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "problem.add_variable(lens, \"radius\", surface_number=1)\n",
    "problem.add_variable(lens, \"radius\", surface_number=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check initial merit function value and system properties:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤════════════════════════╤═══════════════════╕\n",
      "│    │   Merit Function Value │   Improvement (%) │\n",
      "╞════╪════════════════════════╪═══════════════════╡\n",
      "│  0 │                   5.27 │                 0 │\n",
      "╘════╧════════════════════════╧═══════════════════╛\n",
      "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═════════╤═════════╤════════════════╕\n",
      "│    │ Operand Type   │   Target │ Min. Bound   │ Max. Bound   │   Weight │   Value │   Delta │   Contrib. [%] │\n",
      "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═════════╪═════════╪════════════════╡\n",
      "│  0 │ rms spot size  │        0 │              │              │        1 │   2.296 │   2.296 │            100 │\n",
      "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═════════╧═════════╧════════════════╛\n",
      "╒════╤═════════════════╤═══════════╤═════════╤══════════════╤══════════════╕\n",
      "│    │ Variable Type   │   Surface │   Value │ Min. Bound   │ Max. Bound   │\n",
      "╞════╪═════════════════╪═══════════╪═════════╪══════════════╪══════════════╡\n",
      "│  0 │ radius          │         1 │      50 │              │              │\n",
      "│  1 │ radius          │         2 │     -50 │              │              │\n",
      "╘════╧═════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n"
     ]
    }
   ],
   "source": [
    "problem.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define optimizer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = optimization.BasinHopping(problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run optimization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                    message: ['requested number of basinhopping iterations completed successfully']\n",
       "                    success: True\n",
       "                        fun: 0.02367681204887082\n",
       "                          x: [-6.020e-01 -1.416e+00]\n",
       "                        nit: 100\n",
       "      minimization_failures: 25\n",
       "                       nfev: 14164\n",
       "                       njev: 4631\n",
       " lowest_optimization_result:  message: Optimization terminated successfully.\n",
       "                              success: True\n",
       "                               status: 0\n",
       "                                  fun: 0.02367681204887082\n",
       "                                    x: [-6.020e-01 -1.416e+00]\n",
       "                                  nit: 32\n",
       "                                  jac: [ 8.434e-06 -6.044e-06]\n",
       "                             hess_inv: [[ 1.486e+00  1.625e+00]\n",
       "                                        [ 1.625e+00  1.780e+00]]\n",
       "                                 nfev: 126\n",
       "                                 njev: 42"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "optimizer.optimize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Print merit function value and system properties after optimization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤════════════════════════╤═══════════════════╕\n",
      "│    │   Merit Function Value │   Improvement (%) │\n",
      "╞════╪════════════════════════╪═══════════════════╡\n",
      "│  0 │              0.0236768 │           99.5507 │\n",
      "╘════╧════════════════════════╧═══════════════════╛\n",
      "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═════════╤═════════╤════════════════╕\n",
      "│    │ Operand Type   │   Target │ Min. Bound   │ Max. Bound   │   Weight │   Value │   Delta │   Contrib. [%] │\n",
      "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═════════╪═════════╪════════════════╡\n",
      "│  0 │ rms spot size  │        0 │              │              │        1 │   0.154 │   0.154 │            100 │\n",
      "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═════════╧═════════╧════════════════╛\n",
      "╒════╤═════════════════╤═══════════╤══════════╤══════════════╤══════════════╕\n",
      "│    │ Variable Type   │   Surface │    Value │ Min. Bound   │ Max. Bound   │\n",
      "╞════╪═════════════════╪═══════════╪══════════╪══════════════╪══════════════╡\n",
      "│  0 │ radius          │         1 │  39.8051 │              │              │\n",
      "│  1 │ radius          │         2 │ -41.5753 │              │              │\n",
      "╘════╧═════════════════╧═══════════╧══════════╧══════════════╧══════════════╛\n"
     ]
    }
   ],
   "source": [
    "problem.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Draw final lens:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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KfZJbbrkkktwzjnn4OKLL9a2/eY3vwGQ6cuBgQHdORNbt25FS0sLjjjiiBlvK2WcddZZ2Lt3r/bZ9tJLL6G9vR2f/vSnsXPnTmzatAlr1qzBm2++qftivnXrVhx99NHweDxVbD2tWLFCOwc3J/caK/xeyf6bAtUt0je3vPPOO0KWZV3t+5tuukn4fD7R09MjhMisVXHEEUeIs88+W6iqKlKplDjppJPEVVddVa1mUwkXXnihOP7443Xb2He1ac+ePcJut4v77rtPPPbYY+Kxxx4TP/nJT4Tb7RZ+v1877qMf/ahYvXq1iMfjQgghPvGJT4gzzzyzSq0mIfLrLj322GNCiEyJeLvdLl5++eXqNoyKPPzww6K5uVk88sgj2uvs9ttvFytXrhRCCBEKhURra6u4+uqrhRCZtWEOPfRQcc8991Sv0VRSR0eH+PKXv6xd3r17t7Db7eLee+8VQgjR398vGhsbxaOPPlqlFlLOQw89JEwmk/jb3/4mhMis/7hhwwaxZs0arcw4+29qMDDNsOeee04cd9xx4sgjjxQrV64UZ5xxhnjzzTd1x7z33nviwx/+sFi+fLk45phjxDXXXCMURalSi2msLVu2iIaGBiHLsti8ebNuH/uu9nzuc58TAEr+KwxMw8PD4vzzzxdLly4Vq1evFp/85CdFIBCoXsNJCCHEL37xC7Fs2TKxbt06ceyxx4rHH3+82k2iEpYtW1byNZYLTEIIsXXrVrF27Vpx1FFHiVWrVomvfe1rZdeOoer49re/LQCIRYsWiVdeeUXb/swzz4gjjzxSrFmzRqxatUr88Ic/rGIrqdD3v/99cfjhh4tjjz1WHH744eKzn/2s7rNNCPbfVJCEOICTAIiIiIiIiOYQnsNERERERERUBgMTERERERFRGQxMREREREREZTAwERERERERlcHAREREREREVAYDExERERERURkMTERERERERGUwMBEREREREZXBwERERERERFQGAxMREc0Kn/rUp+D1erF+/XqcccYZM37/Z5xxBtavXw+v14tPfepTM37/REQ0PUzVbgAREVGh3bt3Y+HChfB4PFixYgUMhszf9t544w0EAgFs27YNhx56aMnrHnnkkXjuuedmsLV5TzzxBABg/fr1Vbl/IiKaHgxMRERUcyRJwp/+9CesXLkSANDd3Y1DDz0Un/zkJ8uGJSIiounAKXlERFRTZFnGZZddpoUlALjpppsgSRK+8Y1vVLFlREQ0FzEwERFRTWlra8OPf/xj7fLLL7+MzZs346abbkJ7e3vFtzM6OoozzzwTkiThySefxC233ILVq1djwYIFePrpp7FlyxZceumlmD9/Ps477zykUikAwLZt27B8+XKYTCa8/fbb+PznP4/FixfjmGOOwfvvv48f/OAHOPfcc9HW1oY777xzyh8/ERHVFgYmIiKqaddeey3mzZuHL37xiwd0PbvdjnvvvRcAcN999+FLX/oSXnrpJXR0dOCCCy7Ajh078J//+Z/43e9+h0ceeQS/+tWvAACHHXYYrr76aqTTaWzevBnf+9738Pe//x3btm3DiSeeiCOPPBKPPPIIbrvtNnz5y19GX1/flD9mIiKqHQxMRERUs37+85/jr3/9K+68807YbLYDvr7JlDlV9/LLL4fD4YAkSTjuuOMAAJ///OcBAMuWLYPP58OOHTuKrrdp0yYAQENDA5YuXYpVq1Zh9erVAIB169YhnU5j165dE3+ARERU8xiYiIioJsViMdx0001Ys2YNPv7xj0/qtlwul/a70+nUXc7tz03Jq/R6ud9LXY+IiGYPVskjIqKadPfdd2Pv3r345S9/CUmSpux2S91WJbc/9pipbBMREdUujjAREVHN6e3txbe+9S1ccMEFWLNmjbb98ssvx/PPP1/FlhER0VzDwERERDXn5ptvhqqquip0gUAAv/rVr6CqasW3oygKACCRSGjbRkdHdZdz25LJ5AFdb3R0FAB01yMiotmHgYmIiGrK9u3b8eCDD0KWZVx88cVYv3491q9fj2XLlmFkZOSAbuvGG28EAHzta1/D0NAQXn/9dfzsZz9DX18f/u3f/g0A8K1vfQtDQ0N48MEH8Y9//APd3d347ne/CwC46qqrAGSKT2zduhVPPfUUnn76aQghcP311wMAvvrVr8Lv90/VwyciohojCSFEtRtBREQ0WZ/61Kewe/duPPfcc1Vtx/r167FgwQL89Kc/rWo7iIhoanCEiYiIiIiIqAwGJiIiIiIiojJYVpyIiGaN1157DevXr4fT6cQTTzwxo/d9xhlnIBKJ4LXXXsOCBQtm9L6JiGj68BwmIiIiIiKiMjglj4iIiIiIqAwGJiIiIiIiojIYmIiIiIiIiMpgYCIiIiIiIiqDgYmIiIiIiKgMBiYiIiIiIqIyGJiIiIiIiIjKYGAiIiIiIiIq4/8DQL+5AX2Fdh4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens.draw(num_rays=5)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
